<?php

/* Modelo de consulta SQL
 * array(
  'conditions' => array('Model.field' => $thisValue), //array of conditions
  'recursive' => 1, //int
  'fields' => array('Model.field1', 'DISTINCT Model.field2'), //array of field names
  'order' => array('Model.created', 'Model.field3 DESC'), //string or array defining order
  'group' => array('Model.field'), //fields to GROUP BY
  'limit' => n, //int
  'page' => n, //int
  'offset' => n, //int
  'callbacks' => true //other possible values are false, 'before', 'after'
  )
 */
App::uses('CakeEmail', 'Network/Email');
class UsuariosController extends AppController {

    public $name = 'Usuarios';
    public $components = array(
        'Session',
        'Auth'
    );

    public function beforeFilter() {
        parent::beforeFilter();
        $this->Auth->allow(
                'login', 'logout', 'change_password', 'remember_password', 'remember_password_step_2');
    }

    public function index() {
        $this->Usuario->recursive = 0;
        $this->set('usuarios', $this->Usuario->find('all', array(
                    'fields' => array('Usuario.*', 'laboratorio.nome AS nome_lab'),
                    'joins' => array(
                        array(
                            'table' => 'laboratorios',
                            'alias' => 'laboratorio',
                            'type' => 'INNER',
                            'foreignKey' => 'laboratorio_id',
                            'conditions' => array(
                                'laboratorio.id = usuario.laboratorio_id')
                        )
                    )
                        )
                )
        );
    }

    public function login() {

        if ($this->request->is('post')) {
            # Login de usuario
            $usuario = $this->Usuario->find('first', array(
                'conditions' => array(
                    'Usuario.usuario' => $this->request->data['Usuario']['usuario'],
                    'Usuario.senha' => $this->request->data['Usuario']['senha']
                )
                    )
            );
            if ($usuario) {
                $this->Auth->login($usuario['Usuario']);
                if (!empty($this->request->data['Usuario']['lembrar']) && $this->request->data['Usuario']['lembrar'] == 'S') {
                    $cookie = array();
                    $cookie['usuario'] = $this->request->data['Usuario']['usuario'];
                    $cookie['senha'] = $this->Auth->password($this->request->data['Usuario']['senha']);
                    # Escreve cookie ( 1 hora )
                    $this->Cookie->write('Auth.User', $cookie, true);
                }
                # Redireciona para raiz
                $this->redirect($this->Auth->redirect());
            } else {
                $this->Session->setFlash(__('Nome de usuário e/ou senha inválidos. Tente novamente'), 'flash_erro');
            }
        }
    }

    public function logout() {
        # Destroi o cookie
        $this->Cookie->delete('Auth.User');
        $this->Auth->logout();
        # Destroi a sessao
        $this->redirect('/produtos/search');
    }

    public function remember_password() {
        if ($this->request->is('post')) {
            $user = $this->Usuario->findByEmail($this->request->data['Usuario']['email']);

            if (empty($user)) {
                $this->Session->setFlash('Email não encontrado', 'flash_ok');
                $this->redirect(array('action' => 'index'));
            }

            $hash = $this->Usuario->generateHashChangePassword();

            $data = array(
                'Usuario' => array(
                    'id' => $user['Usuario']['id'],
                    'hash_change_password' => $hash
                )
            );

            $this->Usuario->save($data);

            $email = new CakeEmail();
            $email->template('remember_password', 'default')
                    ->config('gmail')
                    ->emailFormat('html')
                    ->subject(__('Lembrete de senha - ' . Configure::read('Application.name')))
                    ->to($user['Usuario']['email'])
                    ->from(Configure::read('Application.from_email'))
                    ->viewVars(array('hash' => $hash))
                    ->send();

            $this->Session->setFlash(__('Verifique sua caixa de entrada e continue o processo'), 'flash_OK');
        }
    }

    public function remember_password_step_2($hash = null) { //metodo chamado por get no link enviado por email
        $user = $this->Usuario->findByHashChangePassword($hash);

        if ($user['Usuario']['hash_change_password'] != $hash || empty($user)) {
            throw new NotFoundException(__('Link inválido'));
        }

        # Hash recebida pro formulario
        $this->set('hash', $hash);

        $this->render('/Usuarios/change_password');
    }

    public function change_password() {
        $user = $this->Usuario->read(null, AuthComponent::user('id'));
        $this->set('usuario', $user);

        if ($this->request->is('post')) {
            # Comparacao de senhas
            if ($this->request->data['Usuario']['senha'] === $this->request->data['Usuario']['re_senha']) {
                # Verifica se usuario esta logado
                if (AuthComponent::user('id')) {
                    $this->request->data['Usuario']['id'] = AuthComponent::user('id');
                } else {
                    # Procura chave hash no banco
                    $user = $this->Usuario->findByHashChangePassword($this->request->data['Usuario']['hash']);

                    if (!empty($user)) {
                        $this->request->data['Usuario']['id'] = $user['Usuario']['id'];
                        # Zera a chave do usuario
                        $this->request->data['Usuario']['hash_muda_senha'] = '';
                    } else {
                        throw new MethodNotAllowedException(__('Ação inválida'));
                    }
                }

                if ($this->User->save($this->request->data)) {
                    $this->Session->setFlash('Senha atualizada com sucesso!', 'flash_ok');
                    $this->redirect(array('/home'));
                }
            } else {
                $this->Session->setFlash('Senhas digitadas não conferem', 'flash_erro');
            }
        }
    }

    public function listAll() {
        $this->Usuario->recursive = 0;
        $this->set('usuarios', $this->Usuario->find('all', array(
                    'fields' => array('Usuario.*', 'laboratorio.nome AS nome_lab'),
                    'joins' => array(
                        array(
                            'table' => 'laboratorios',
                            'alias' => 'laboratorio',
                            'type' => 'INNER',
                            'foreignKey' => 'laboratorio_id',
                            'conditions' => array(
                                'laboratorio.id = usuario.laboratorio_id')
                        )
                    )
                        )
                )
        );
    }

    public function add() {

        if ($this->request->is('get')) {
            $this->loadModel('Laboratorio'); //chamada do modelo referente a laboratorio
            $this->set('laboratorios', $this->Laboratorio->find('list', array(
                        'fields' => array('id', 'nome'),
                        'order' => array('nome')
                            )
            )); //chamada para dropdown de laboratorio
        } else
        if ($this->request->is('post')) {
            $this->Usuario->create();
            if ($this->Usuario->save($this->request->data)) {
                $this->Session->setFlash(__('Usuário salvo com sucesso.'));
                $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash(__('O usuário não pôde ser salvo. Tente novamente.'));
            }
        }
    }

    public function edit($id = null) {
        if ($this->request->is('get')) {
            if (!(($this->Auth->user('id') == $id && $this->Auth->user('cargo') == 'funcionario') ||
                    $this->Auth->user('cargo') == 'admin')) {
                
                $this->Session->setFlash(__('Você pode editar apenas seu próprio perfil'), 'flash_erro');
                $this->redirect(array('action' => 'index'));
            }
            $this->loadModel('Laboratorio'); //chamada do modelo referente a laboratorio
            $this->set('laboratorios', $this->Laboratorio->find('list', array(
                        'fields' => array('id', 'nome'),
                        'order' => array('nome')
                            )
            )); //chamada para dropdown de laboratorio
        }
        $this->Usuario->id = $id;
        if (!$this->Usuario->exists()) {
            throw new NotFoundException(__('Usuário inválido.'));
        }
        if ($this->request->is('post') || $this->request->is('put')) {
            if ($this->Usuario->save($this->request->data)) {
                $this->Session->setFlash(__('O usuário foi atualizado.'), 'flash_ok');
                $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash(__('O usuário não pôde ser atualizado. Tente novamente.'));
            }
        } else {
            $this->request->data = $this->Usuario->read(null, $id);
            unset($this->request->data['Usuario']['senha']);
        }
    }

    public function delete($id = null) {
        $this->request->onlyAllow('post');
        $this->Usuario->id = $id;
        if (!$this->Usuario->exists()) {
            throw new NotFoundException(__('Usuário inválido.'));
        }
        if ($this->Usuario->delete()) {
            $this->Session->setFlash(__('Usuário removido com sucesso.'), 'flash_ok');
            $this->redirect(array('action' => 'index'));
        }
        $this->Session->setFlash(__('O usuário não pôde ser deletado.'), 'flash_erro');
        $this->redirect(array('action' => 'index'));
    }

    public function isAuthorized($user) {
        if (!parent::isAuthorized($user)) {
            if ($this->Auth->user('cargo') === 'funcionario' && in_array($this->action, array('edit'))) {
                return true;
            }
        } else {
            return true;
        }
    }

}
?>
